
package com.jf.cloud.user.mapper;

import cn.hutool.core.date.DateTime;
import com.jf.cloud.api.user.vo.MemberOverviewVO;
import com.jf.cloud.api.user.vo.UserApiVO;
import com.jf.cloud.api.user.vo.UserManagerVO;
import com.jf.cloud.common.database.util.PageAdapter;
import com.jf.cloud.user.dto.UserManagerDTO;
import com.jf.cloud.user.model.User;
import com.jf.cloud.user.vo.UserVO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 用户表
 *
 * @author zz
 * @date 2020-12-08 11:18:04
 */
public interface UserMapper {

    /**
     * 获取用户表列表
     *
     * @return 用户表列表
     */
    List<UserVO> list(@Param("userManagerDTO") UserManagerDTO userManagerDTO);

    /**
     * 根据用户表id获取用户表
     *
     * @param userId 用户表id
     * @return 用户表
     */
    UserApiVO getByUserId(@Param("userId") Long userId);
    User getById(@Param("userId") Long userId);
    /**
     * 保存用户表
     *
     * @param user 用户表
     */
    void save(@Param("user") User user);

    /**
     * 更新用户表
     *
     * @param user 用户表
     */
    void update(@Param("user") User user);

    /**
     * 删除用户
     *
     * @param userId 用户Id
     */
    void deleteById(@Param("userId") Long userId);


    /**
     * 根据成长值范围，更新普通用户的等级
     *
     * @param level     更新至该等级
     * @param minGrowth 最小成长值
     * @param maxGrowth 最大成长值
     */
    void updateUserLevel(@Param("level") Integer level, @Param("minGrowth") int minGrowth, @Param("maxGrowth") Integer maxGrowth);

    /**
     * 根据用户id列表，获取用户信息
     *
     * @param userIds
     * @return
     */
    List<UserApiVO> getUserByUserIds(@Param("userIds") List<Long> userIds);


    /**
     * 根据查询用户的条件，查询用户数量
     *
     * @param userManagerDTO 用户查询条件
     * @return 数量
     */
    Long countUserPageByParam(@Param("userManagerDTO") UserManagerDTO userManagerDTO);

    /**
     * 根据查询条件，获取会员信息
     *
     * @param userManagerDTO 用户查询条件
     * @param pageAdapter
     * @return 会员管理的会员信息列表
     */
    List<UserManagerVO> listUserByParam(@Param("userManagerDTO") UserManagerDTO userManagerDTO, @Param("pageAdapter") PageAdapter pageAdapter);

    /**
     * 将用户等级从用户扩展表同步到用户表里面
     *
     * @param userIds
     */
    void updateUserLevelByUserExtensionAndUserIds(@Param("userIds") List<Long> userIds);

    /**
     * 更新用户等级，通过购买会员
     *
     * @param userId     用户id
     * @param afterLevel 购买后的等级
     * @param date       会员过期时间
     */
    void updateUserLevelByBuyVip(@Param("userId") Long userId, @Param("afterLevel") Integer afterLevel, @Param("date") Date date);

    /**
     * 通过用户手机号查询多个用户信息
     * @param phones 手机号列表
     * @return 用户信息列表
     */
    List<UserVO> getUserListByPhones(@Param("phones") List<String> phones);

    /**
     * 批量保存用户
     * @param users 用户列表
     * @return 影响行数
     */
    int saveBatch(@Param("users") List<User> users);

    /**
     * 获取时间端类注册的用户
     * @param status 用户状态
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 用户列表
     */
    List<UserVO> getUserByCreateTimeRange(@Param("status") Integer status, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 根据时间范围获取会员人数统计信息
     * @param startTime
     * @param endTime
     * @return
     */
    MemberOverviewVO getUserCountInfo(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 根据手机号码查用户数量
     * @param mobile 手机号码
     * @return 数量
     */
    int countUserByMobile(@Param("mobile") String mobile);

    /**
     * 根据等级查询属于该等级的用户数
     * @param level 等级
     * @param levelType 类型
     * @return 用户数
     */
    int countUserByLevel(@Param("level") Integer level,@Param("levelType") Integer levelType);

    /**
     * 获取截至日期之前的所有付费会员信息
     * @param endOfDay 截至日期
     * @return
     */
    List<UserVO> selectMemberByEndTime(@Param("endOfDay") DateTime endOfDay);

    /**
     * 将会员的类型以及等级，重用户扩展表同步掉user表
     * @param userIds 用ids
     * @return
     */
    int updateUserTypeLevelByUserExtensionAndUserIds(@Param("userIds") List<Long> userIds);

    /**
     * 获取指定等级类型的用户id
     * @param levelType
     * @return
     */
    List<Long> getUserIdListByLevel(@Param("levelType") Integer levelType);

    /**
     * 根据搜索条件获取用户列表
     * @param userApiVO
     * @return
     */
    List<UserApiVO> getUserByParam(@Param("userApiVO") UserApiVO userApiVO);

    Long countOrgUser();
}
